<?php

App::import('Model', 'ExpenditureType');
App::import('Model', 'Expense');
App::import('Model', 'Property');
App::import('Model', 'Account');
App::import('Model', 'PropertyType');
App::import('Model', 'LookupValue');

class Building extends AppModel {

    var $name = 'Building';
    var $primaryKey = 'building_id';
    var $displayField = 'building_name';
    var $hasOne = array(
        'PaymentDue',
        'RefinancingSystem'
    );
    var $belongsTo = array(
        'BuildingAptBussiness' => array(
            'className' => 'LookupValue',
            'foreignKey' => 'apt_business',
            'conditions' => array('BuildingAptBussiness.lookup_type' => 'APT_BUSINESS'),
            'order' => 'BuildingAptBussiness.meaning'
        ),
        'BuildingDoorman' => array(
            'className' => 'Person',
            'foreignKey' => 'doorman_id'
        ),
        'Address',
        'BuildingExpenseLiquidationType' => array(
            'className' => 'LookupValue',
            'foreignKey' => 'expense_liquidation_type',
            'conditions' => array('BuildingExpenseLiquidationType.lookup_type' => 'EXPENSE_LIQUIDATION_TYPE'),
            'order' => 'BuildingExpenseLiquidationType.meaning'
        ),
        'Customer'
    );
    var $hasMany = array(
        'Expenditure',
        'PeriodicExpenditureType',
        'Property',
        'PropertyType',
        'CouncilMember'
    );


/*	function paginate($conditions, $fields, $order, $limit, $page = 1, $recursive = null, $extra = array()) {
		$recursive = -1;
	//	$group = $fields = array('week', 'away_team_id', 'home_team_id');
	 return $this->find('all', compact('conditions', 'fields', 'order', 'limit', 'page', 'recursive', 'group'));
	}

	function paginateCount($conditions = null, $recursive = 0, $extra = array()) {
	$sql = "SELECT * from buildings, ";
	$this->recursive = $recursive;
	$results = $this->query($sql);
	return count($results);
	}
*/
    function process_month_expenses($data = null) {
        //var_dump($data);
        // Obtengo el mes corriente
        $month = date('m');
        // Calculo del monto por tipo de propiedad para el edificio
        $property_type_amount = $this->getPropertyTypeAmounts($data);
        //var_dump($property_type_amount);
        // Para cada propiedad del edificio en cuestion
        foreach ($data['Property'] as $property) {
            $propertyEntity = new Property();
            $property_data = $propertyEntity->read(null,$property['property_id']);
            //echo $property['flat'] . '</br>';
            $account = new Account();
            $account_data = $account->read(null,$property_data['Account']['account_id']);
            //Datos de expensa ordinaria para la propiedad
            $expense_data = array();
            $expense_data['Expense']['property_id'] = $property['property_id'];
            $expense_data['Expense']['amount']      = 0;
            $expense_data['Expense']['payment_amount'] = 0;
            $expense_data['Expense']['interests'] = 0;
            $expense_data['Expense']['previous_debt'] = 0;
            //Seteo expensa ordinaria
            $expense_data['Expense']['expenditure_type_source'] = 5;
            //Aca hay que obtener el ultimo numero de expensa de la propiedad + 1
            $expense_data['Expense']['expense_number'] = $this->obtenerNumeroUltimaExpensa($expense_data) + 1;

            //Datos de expensa extraordinaria para la propiedad
            $special_expense_data = array();
            $special_expense_data['Expense']['amount'] = 0;
            $special_expense_data['Expense']['property_id'] = $property['property_id'];
            $special_expense_data['Expense']['payment_amount'] = 0;
            $special_expense_data['Expense']['interests'] = 0;
            $special_expense_data['Expense']['previous_debt'] = 0;
            //Seteo expensa extraordinaria
            $special_expense_data['Expense']['expenditure_type_source'] = 6;
            //Aca hay que obtener el ultimo numero de expensa de la propiedad + 2
            $special_expense_data['Expense']['expense_number'] = $this->obtenerNumeroUltimaExpensa($special_expense_data) + 1;

            //Determino el monto del mes
            $expenseLiquidationType = $this->getExpenseLiquidationType($data['Building']);
            if ($expenseLiquidationType == 'FIXED') {
                // 'Monto Fijo'
                $this->setFixedExpenseAmount($property_type_amount, $property, $expense_data, $special_expense_data);
            } else { // 'FORECAST'
                //'Prorrateo de Gastos'
                $this->setVariableExpenseAmount($property_type_amount, $property, $expense_data, $special_expense_data);
            }

            //Calculo de intereses para el segundo vencimiento
            $interestScheme = $this->obtenerInterestSchemeType($data['PaymentDue']);
            if ($interestScheme == 'SECOND_DUE_DATE') {
                $this->setExpenseSecondDueAmounts($data['PaymentDue'], $expense_data, $special_expense_data);
            }
            
            //Calculo de deuda previa e intereses
            $this->setPreviousDebt($expense_data, $data);
            $this->setPreviousDebt($special_expense_data, $data);

            // Pago si me queda saldo a favor
            $this->payIfPosible($expense_data, $special_expense_data, $account_data["Account"]);

            // Descuento las expensas del saldo de las cuentas de propiedad
            $account_data["Account"]["regular_expense_balance"] -= $expense_data['Expense']['amount'];
            $account_data["Account"]["regular_interests_balance"] -= $expense_data['Expense']['interests'];
            $account_data["Account"]["special_expense_balance"] -= $special_expense_data['Expense']['amount'];
            $account_data["Account"]["special_interest_balance"] -= $special_expense_data['Expense']['interests'];
            $account->save($account_data);

            /*var_dump($expense_data);
            print_r("\n");
            var_dump($special_expense_data);
			print_r("\n\n\n");*/

            //Insercion si hay algo para pagar.
            if (($expense_data['Expense']['amount'] > 0)||
                ($expense_data['Expense']['previous_debt'] > 0)){
                $expense = new Expense;
                $expense->create();
                $expense->save($expense_data);
            }
            if (($special_expense_data['Expense']['amount'] > 0) ||
                ($special_expense_data['Expense']['previous_debt'] > 0)){
                $special_expense = new Expense;
                $special_expense->create();
                $special_expense->save($special_expense_data);
            }
        }
        return true;
    }

    /**
     * Carga el monto de la expensa por tipo de propiedad segun el sistema de
     * liquidacion del edificio.
     *
     * @param <type> $data
     * @return array vector con la informacion de monto por tipo de expensa y
     *               tipo de propiedad
     */
    function getPropertyTypeAmounts($data) {
        $property_type_amount_data = array();
        $expenseLiquidationType = $this->getExpenseLiquidationType($data['Building']);
        if ($expenseLiquidationType == 'FIXED') {
            // 'Monto Fijo'
            $this->setPropertyTypeExpenseFixedAmount($data, $property_type_amount_data);
        } else { // 'FORECAST'
            //'Prorrateo de Gastos'
            $this->setPropertyTypeExpenseVariableAmount($data, $property_type_amount_data);
        }

        return $property_type_amount_data;
    }

    /**
     * Carga el vector property_type_amount_data sumando segun el valor cargado
     * en el tipo de propiedad.
     *
     * @param <type> $data
     * @param <type> $property_type_amount_data 
     */
    function setPropertyTypeExpenseFixedAmount($data, & $property_type_amount_data) {
        foreach ($data['PropertyType'] as $property_type_data) {
            $property_type_amount_data[$property_type_data['property_type_order']]['property_type_id'] = $property_type_data['property_type_id'];
            $property_type_amount_data[$property_type_data['property_type_order']]['expense_amount'] = $property_type_data['expense_amount'];
            $property_type_amount_data[$property_type_data['property_type_order']]['special_expense_amount'] = $property_type_data['special_expense_amount'];
        }
    }

    /**
     * Carga el vector property_type_amount_data sumando segun la distribucion
     * de gastos por tipo de propiedad y el coeficiente correspondiente a la
     * misma.
     * 
     * @param <type> $data
     * @param <type> $property_type_amount_data 
     */
    function setPropertyTypeExpenseVariableAmount($data, & $property_type_amount_data) {
        // Inicializo los tipos de propiedad
        foreach ($data['PropertyType'] as $property_type_data) {
            $property_type_amount_data[$property_type_data['property_type_order']]['property_type_id'] = $property_type_data['property_type_id'];
            $property_type_amount_data[$property_type_data['property_type_order']]['expense_amount'] = 0;
            $property_type_amount_data[$property_type_data['property_type_order']]['special_expense_amount'] = 0;
            $property_type_amount_data[$property_type_data['property_type_order']]['coefficient'] = $property_type_data['coefficient'];
        }
        
        $month = date('m');
        $year = (date('Y'));
        $expenditure = new Expenditure;
        // Tomo las previsiones hechas para este mes
        $month_expenditures_list =
                    $expenditure->find('all'
                            , array('conditions' => array('Expenditure.building_id' => $data['Building']['building_id']
                                                        , 'Expenditure.forecast_year' => $year
                                                        , 'Expenditure.forecast_month' => $month)));
        if (count($month_expenditures_list) == 0)
            return; // no hay previsiones

        // Recorro todos los gastos
        foreach ($month_expenditures_list as $expenditure) {
            $expenditure_data = $expenditure['Expenditure'];
            //var_dump($expenditure_data);
            $prev_coeff = 0;
            $current_coeff = 0;
            $effective_coeff = 0;
            $effective_surface = 0;

            // Busco las tipos de propiedad ordenadas por coeficiente de distribucion creciente
            $expenditure_distribution = new ExpenditureDistribution;
            $expenditure_distribution_list =
                    $expenditure_distribution->find('all'
                            , array('conditions' => array('ExpenditureDistribution.expenditure_type_id' => $expenditure_data['expenditure_type_id']
                                                        , 'PropertyType.building_id' => $property_type_data['building_id'])
                            , 'order' => array('ExpenditureDistribution.coefficient ASC')));
            foreach ($expenditure_distribution_list as $expenditure_distribution) {
                if (  ($expenditure_distribution['ExpenditureDistribution']['coefficient'] == 0)
                    ||(  ($prev_coeff == $current_coeff)
                       &&($current_coeff == $expenditure_distribution['ExpenditureDistribution']['coefficient']))){
                    //print_r('No se procesa en este ciclo: '.$expenditure_distribution['PropertyType']['description'].'<br>');
                    continue;
                }
                if (  ($prev_coeff == $current_coeff)
                       && ($current_coeff < $expenditure_distribution['ExpenditureDistribution']['coefficient'])){
                    //echo('Actualizar Coeficiente <br> <br>');
                    $current_coeff = $expenditure_distribution['ExpenditureDistribution']['coefficient'];
                    $effective_coeff = $current_coeff - $prev_coeff;
                    $effective_surface = $this->getEffectiveSurface($expenditure_distribution_list,$current_coeff);
                    //echo('Previo '. $prev_coeff .' <br>');
                    //echo('Actual '. $current_coeff .' <br>');
                    //echo('Efectivo '. $effective_coeff .' <br>');
                    //echo('Superficie Efectiva '. $effective_surface .' <br><br>');
                }

                foreach ($expenditure_distribution_list as $expenditure_distribution_aux) {
                    if ($expenditure_distribution_aux['ExpenditureDistribution']['coefficient'] >= $current_coeff) {
                        $expenditure_type = new ExpenditureType;
                        $expenditure_type_data = $expenditure_type->read(null, $expenditure_data['expenditure_type_id']);
                        $expenditure_type_source = $this->getExpenditureTypeSource($expenditure_type_data['ExpenditureType']);
                        if ($expenditure_type_source == 'REGULAR'){
                            //echo('<br><br>Suma al gasto ordinario: '.$expenditure_distribution_aux['PropertyType']['description'] . ' ');
                            //echo($effective_coeff * $expenditure_distribution_aux['PropertyType']['coefficient'] * $expenditure_data['amount'] / $effective_surface . '<br><br>');
                            $property_type_amount_data[$expenditure_distribution_aux['PropertyType']['property_type_order']]['expense_amount']
                                += ($effective_coeff * $expenditure_distribution_aux['PropertyType']['coefficient'] * $expenditure_data['amount'] / $effective_surface);
                        } else if ($expenditure_type_source == 'SPECIAL'){
                            //echo('<br><br>Suma al gasto extraordinario: '.$expenditure_distribution_aux['PropertyType']['description'] . ' ');
                            //echo($effective_coeff * $expenditure_distribution_aux['PropertyType']['coefficient'] * $expenditure_data['amount'] / $effective_surface . '<br><br>');
                            $property_type_amount_data[$expenditure_distribution_aux['PropertyType']['property_type_order']]['special_expense_amount']
                                += ($effective_coeff * $expenditure_distribution_aux['PropertyType']['coefficient'] * $expenditure_data['amount'] / $effective_surface);
                        }
                    }
                }
                $prev_coeff = $current_coeff;
                //echo('<br><br>Distribucion de gasto siguiente<br><br>');
            }
        }
    }

    /**
     * La funcion calcula la sumatoria de coeficientes de tipos de propiedad
     * entre las que se distribuye la porcion de gasto que se esta analizando,
     * partiendo del coeficiente current_coeff de la distribucion de gasto.
     * (En m^2 es la superficie total efectiva)
     *
     * @param <array> $expenditure_distribution_list listado de distribucion
     *                 de gastos por tipo de propiedad
     * @param <double> $current_coeff coeficiente de distribucion minimo para
     *                 que el tipo de propiedad acumule a la superficie efectiva
     * @return <double> superficie efectiva deaplicacion del gasto
     */
    function getEffectiveSurface($expenditure_distribution_list,$current_coeff){
        $effective_surface = 0;
        foreach ($expenditure_distribution_list as $expenditure_distribution) {
            if ($expenditure_distribution['ExpenditureDistribution']['coefficient'] >= $current_coeff)
            {
                $effective_surface += $expenditure_distribution['PropertyType']['coefficient'];
            }
        }
        return $effective_surface;
    }

    /**
     * Para cada propiedad fija el monto de la expensa de acuerdo al valor
     * calculado para el tipo de propiedad. Todas las propiedades del mismo tipo
     * abonan el mismo monto.
     *
     * @param <array> $property_type_amount
     * @param <array> $property
     * @param <array> $expense_data
     * @param <array> $special_expense_data
     */
    function setFixedExpenseAmount($property_type_amount, $property, & $expense_data, & $special_expense_data) {
        foreach ($property_type_amount as $property_type_amount_data) {
            if ($property_type_amount_data['property_type_id'] == $property['property_type_id']) {
                $expense_data['Expense']['amount'] = round($property_type_amount_data['expense_amount'],2);
                $special_expense_data['Expense']['amount'] = round($property_type_amount_data['special_expense_amount'],2);
                break;
            }
        }
    }

    /**
     * Para cada propiedad fija el monto de la expensa de acuerdo al valor
     * calculado para el tipo de propiedad segun: dividendo / valor.
     * Esto es ver que porcentaje del gasto del tipo de propiedad le corresponde
     * a la propiedad individual.
     *
     * @param <array> $property_type_amount
     * @param <array> $property
     * @param <array> $expense_data
     * @param <array> $special_expense_data
     */
    function setVariableExpenseAmount($property_type_amount, $property, & $expense_data, & $special_expense_data) {
        foreach ($property_type_amount as $property_type_amount_data) {
            if ($property_type_amount_data['property_type_id'] == $property['property_type_id']) {
                $expense_data['Expense']['amount'] =
                    round(($property['dividend'] / $property_type_amount_data['coefficient']) * $property_type_amount_data['expense_amount'],2);
                $special_expense_data['Expense']['amount'] =
                    round(($property['dividend'] / $property_type_amount_data['coefficient']) *  $property_type_amount_data['special_expense_amount'],2);
                break;
            }
        }
    }

    /**
     * Funcion que calcula el valor indicado para el segundo vencimiento.
     * 
     * @param <type> $paymentDue
     * @param array $expense_data
     * @param array $special_expense_data
     */
    function setExpenseSecondDueAmounts($paymentDue, & $expense_data, & $special_expense_data) {
        $expense_data['Expense']['second_due_amount'] = round($expense_data['Expense']['amount'] * (1 + $paymentDue['second_due_rate']),2);
        $special_expense_data['Expense']['second_due_amount'] = round($special_expense_data['Expense']['amount'] * (1 + $paymentDue['second_due_rate']),2);
    }

    function setPreviousDebt(&$expense_data, &$data) {
        // sistema de liquidación de intereses ('SECOND_DUE_DATE','ON_DATE','DEFERRED')
        $sistemaLiq = $this->obtenerInterestSchemeType($data['PaymentDue']);
        $intereses = 0; //por default es 0
        $expen = new Expense; //un objeto expensa para usar sus metodos
        $diaPrimerVencimiento = $data['PaymentDue']['first_due_date'];
        $diaSegundoVencimiento = $data['PaymentDue']['second_due_date'];

        //var_dump($expen->gapDatesPeriodo("2010-09-01","2010-10-21"));
        //print_r('<p>');
        //var_dump($expense_data['Expense']);
        //print_r('</br>');
        //print_r('<p>');
        //var_dump($data['PaymentDue']);
        //print_r('</br>');
        //fecha de pago de la ultima expensa (si se pago y cuanto)
        //busco ultima expensa
        $ultima_expensa = new Expense;
        $ultima_expensa_data = $ultima_expensa->find('first', array('conditions' => array('Expense.property_id' => $expense_data['Expense']['property_id'], 'Expense.expenditure_type_source' => $expense_data['Expense']['expenditure_type_source']), 'order' => array('Expense.expense_number DESC')));

        $fechaExpensa = new DateTime(substr($ultima_expensa_data['Expense']['created'], 0, 10)); //fecha de creacion de la expensa


        if ($ultima_expensa_data == false) {
            $expense_data['Expense']['previous_debt'] = 0;
            $expense_data['Expense']['interests'] = 0;
            return;
        }

	

        //si la expensa anterior tiene plan de refinanciamiento, salgo. No adeuda nada
        if ($ultima_expensa_data['Expense']['refinancing_plan_id'] != NULL) { //hay plan
           // print_r('hay plan');
            return;
        } else {//no hay plan
            //print_r('no hay plan');
            //me fijo si esta paga, la fecha de pago
            if ($ultima_expensa_data['Expense']['payment_date'] == NULL) {//no pago
                //chequeo el tipo de penalizacion
                if ($sistemaLiq == 'SECOND_DUE_DATE') {
		    //'Interes punitorio a segunda fecha de vencimiento': 
		    //    Está la primer fecha de vencimiento, y la segunda fecha de vencimiento, que se aplica un recargo.
		    //    Después de eso se calculan intereses por día de atraso, a partir de la segunda fecha de vencimiento.
		    //    Y por la deuda previa, el interes se calcula por día de atraso en el mes.
                    $monto_adeudado_anterior = $ultima_expensa_data['Expense']['previous_debt'];
                    $monto_vencido_anterior = $ultima_expensa_data['Expense']['second_due_amount']; //si nunca pago, va el segundo amount
		    $interesesAnteriores = $ultima_expensa_data['Expense']['interests'];
                    $total_adeudado =$interesesAnteriores+ $monto_adeudado_anterior + $monto_vencido_anterior;
		     //intereses
		    //$diasDesdeSegundaFechaHastaAhora = $expen->gapDates($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . $diaSegundoVencimiento);
		    //$interesesMonto = $diasDesdeSegundaFechaHastaAhora * ($data['PaymentDue']['annual_rate'] / 365) * $monto_vencido_anterior;
		    
		    $diasDesdePrincipioMes = $expen->gapDates($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . "1");		    
		    $interesesDeudaPrevia  =  $diasDesdePrincipioMes * ($data['PaymentDue']['annual_rate'] / 365) * ($interesesAnteriores+ $monto_adeudado_anterior + $monto_vencido_anterior);
		    
		    $intereses=$interesesDeudaPrevia;
		}
                if ($sistemaLiq == 'ON_DATE') {
		    //'Interes en fecha de pago'
		    //   Está la primer fecha de vencimiento.
		    //   Después de eso se calculan intereses por día de atraso, a partir de la fecha de vencimiento.
		    //   Y por la deuda previa, el interes se calcula por día de atraso en el mes.
                    $monto_adeudado_anterior = $ultima_expensa_data['Expense']['previous_debt'];
		    $interesesAnteriores = $ultima_expensa_data['Expense']['interests'];
                  
		    $monto = $ultima_expensa_data['Expense']['amount'];
                    $total_adeudado =$interesesAnteriores + $interesesAnteriores + $monto;

                  //  $diasDesdePrimerFechaHastaAhora = $expen->gapDates($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . $diaPrimerVencimiento);
                   // $interesesMonto = $diasDesdePrimerFechaHastaAhora * ($data['PaymentDue']['annual_rate'] / 365) * $monto;

		    $diasDesdePrincipioMes = $expen->gapDates($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . "1");
		    $interesesDeudaPrevia  =  $diasDesdePrincipioMes * ($data['PaymentDue']['annual_rate'] / 365) * ($monto_adeudado_anterior + $interesesAnteriores + $monto);
		    
		    $intereses=$interesesDeudaPrevia;
		    
                }
                if ($sistemaLiq == 'DEFERRED') {
		    //'Interes diferido a proxima liquidacion'
		    //    Está la primer fecha de vencimiento.
		    //    Después de eso se calculan intereses por día de atraso, a partir de la fecha de vencimiento, en la liquidación del mes siguiente.
		    //    Y por la deuda previa, el interes se calcula por día de atraso en el mes, en la liquidacion del mes siguiente.
                    $monto_adeudado_anterior = $ultima_expensa_data['Expense']['previous_debt'];
		    $interesesAnteriores = $ultima_expensa_data['Expense']['interests'];
                   
		    $monto = $ultima_expensa_data['Expense']['amount'];
                    $total_adeudado =$interesesAnteriores + $interesesAnteriores + $monto;

		    //COMO ES DIFERIDO, LE CALCULO ESTOS INTERESES
                    $diasDesdePrimerFechaHastaAhora = $expen->gapDates($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . $diaPrimerVencimiento);
                    $interesesMonto = $diasDesdePrimerFechaHastaAhora * ($data['PaymentDue']['annual_rate'] / 365) * $monto;

		    $diasDesdePrincipioMes = $expen->gapDates($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . "1");
		    $interesesDeudaPrevia  =  $diasDesdePrincipioMes * ($data['PaymentDue']['annual_rate'] / 365) * ($monto_adeudado_anterior + $interesesAnteriores + $monto);
		    
		    $intereses=$interesesMonto + $interesesDeudaPrevia;
                }
            } else {//pago
                //pago, deberia chequear cuando pago (para ver que interes corresponde) y cuanto.
                $fechaDePago = $ultima_expensa_data['Expense']['payment_date'];
                $montoPagado = $ultima_expensa_data['Expense']['payment_amount'];
		

                $diasGap = $expen->gapDates($fechaDePago);
                //chequeo el tipo de penalizacion
                if ($sistemaLiq == 'SECOND_DUE_DATE') {
                    $monto_adeudado_anterior = $ultima_expensa_data['Expense']['previous_debt'];
		    $interesesAnteriores = $ultima_expensa_data['Expense']['interests'];

                        if ($this->pagoAntesDeFechaVencimiento($diaPrimerVencimiento, $fechaDePago)){
			    $monto_vencido_anterior = $ultima_expensa_data['Expense']['amount'];
			    $interesesMonto=0;
}
                        else{
                            $monto_vencido_anterior=$ultima_expensa_data['Expense']['second_due_amount'];
			    //intereses
			   // $diasDesdeSegundaFechaHastaQuePago = $expen->gapDatesPeriodo($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . $diaSegundoVencimiento, $fechaDePago);
			   // $interesesMonto = $diasDesdeSegundaFechaHastaQuePago * ($data['PaymentDue']['annual_rate'] / 365) * $monto_vencido_anterior;
		    
			   }
		
		    $diasDesdePrincipioMes = $expen->gapDates($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . "1");
		    $interesesDeudaPrevia  =  $diasDesdePrincipioMes * ($data['PaymentDue']['annual_rate'] / 365) * ($interesesAnteriores+ $monto_adeudado_anterior + $monto_vencido_anterior - $montoPagado);
                    
		    //CALCULO FINAL
                    $total_adeudado =$interesesAnteriores+ $monto_adeudado_anterior + $monto_vencido_anterior - $montoPagado;
		    //$intereses=$interesesMonto+$interesesDeudaPrevia;
		      $intereses=$interesesDeudaPrevia;
                }
                if ($sistemaLiq == 'ON_DATE') {
                    $monto_adeudado_anterior = $ultima_expensa_data['Expense']['previous_debt'];
                    $monto_vencido_anterior = $ultima_expensa_data['Expense']['amount'];
		    $interesesAnteriores = $ultima_expensa_data['Expense']['interests'];

                     $diasDesdePrincipioMes = $expen->gapDates($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . "1");
		    $interesesDeudaPrevia  =  $diasDesdePrincipioMes * ($data['PaymentDue']['annual_rate'] / 365) * ($interesesAnteriores + $monto_adeudado_anterior + $monto_vencido_anterior - $montoPagado);

		    //CALCULO FINAL
                            $total_adeudado = $interesesAnteriores + $monto_adeudado_anterior + $monto_vencido_anterior - $montoPagado; 
			    $intereses = $interesesDeudaPrevia;
			    //$interesesMenosPago = $intereses - $montoPagado;
			 
	  
//                         if ($this->pagoAntesDeFechaVencimiento($diaPrimerVencimiento, $fechaDePago)) {//SOLO INTERESES POR DEUDA PREVIA
// 			   //CALCULO FINAL
//                             $total_adeudado = $monto_adeudado_anterior + $monto_vencido_anterior - $montoPagado; 
// 			    $intereses = $interesesDeudaPrevia;
// 			    $interesesMenosPago = $intereses - $montoPagado;
// 			     if ($interesesMenosPago < 0) {//primero resto de los intereses, si sobre plata resto de la deuda
//                                 $total_adeudado = $total_adeudado + $interesesMenosPago;
//                                 $intereses = 0;
//                             } else {
//                                 //$total_adeudado queda igual, no alcanza para pagar
//                                 $intereses = $interesesMenosPago; //se reducen los intereses
//                             }
//                         } else {//INTERESES DE DESPUES DEL VENCIMIENTO MAS INTERESES POR DEUDA PREVIA
//                             $diasDeAtraso = $expen->gapDatesPeriodo($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . $diaPrimerVencimiento, $fechaDePago);
// 
// 		    
//                             //CALCULO FINAL
//                             $total_adeudado = $monto_adeudado_anterior + $monto_vencido_anterior;
//                             $intereses = $diasDeAtraso * ($data['PaymentDue']['annual_rate'] / 365) * $total_adeudado;
//                             $interesesMenosPago = $intereses - $montoPagado;
//                             if ($interesesMenosPago < 0) {//primero resto de los intereses, si sobre plata resto de la deuda
//                                 $total_adeudado = $total_adeudado + $interesesMenosPago;
//                                 $intereses = 0;
//                             } else {
//                                 //$total_adeudado queda igual, no alcanza para pagar
//                                 $intereses = $interesesMenosPago; //se reducen los intereses
//                             }
//                        
//                     }
                }
                if ($sistemaLiq == 'DEFERRED') {

		    $monto_adeudado_anterior = $ultima_expensa_data['Expense']['previous_debt'];
                    $monto_vencido_anterior = $ultima_expensa_data['Expense']['amount'];
		    $interesesAnteriores = $ultima_expensa_data['Expense']['interests'];

                     $diasDesdePrincipioMes = $expen->gapDates($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . "1");
		    $interesesDeudaPrevia  =  $diasDesdePrincipioMes * ($data['PaymentDue']['annual_rate'] / 365) * ($interesesAnteriores + $monto_adeudado_anterior + $monto_vencido_anterior - $montoPagado);

		    //COMO ES DIFERIDO, LE CALCULO ESTOS INTERESES
                    //$diasDesdePrimerFechaHastaAhora = $expen->gapDates($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . $diaPrimerVencimiento);
                   // $interesesMonto = $diasDesdePrimerFechaHastaAhora * ($data['PaymentDue']['annual_rate'] / 365) * $monto;

		    //CALCULO FINAL
                            $total_adeudado = $interesesAnteriores + $monto_adeudado_anterior + $monto_vencido_anterior - $montoPagado; 
			    $intereses = $interesesDeudaPrevia;
			   // $interesesMenosPago = $intereses - $montoPagado;
			  
//                         if ($this->pagoAntesDeFechaVencimiento($diaPrimerVencimiento, $fechaDePago)) {//SOLO INTERESES POR DEUDA PREVIA
// 			   //CALCULO FINAL
//                             $total_adeudado = $monto_adeudado_anterior + $monto_vencido_anterior - $montoPagado; 
// 			    $intereses = $interesesDeudaPrevia;
// 			    $interesesMenosPago = $intereses - $montoPagado;
// 			     if ($interesesMenosPago < 0) {//primero resto de los intereses, si sobre plata resto de la deuda
//                                 $total_adeudado = $total_adeudado + $interesesMenosPago;
//                                 $intereses = 0;
//                             } else {
//                                 //$total_adeudado queda igual, no alcanza para pagar
//                                 $intereses = $interesesMenosPago; //se reducen los intereses
//                             }
//                         } else {//INTERESES DE DESPUES DEL VENCIMIENTO MAS INTERESES POR DEUDA PREVIA
//                             $diasDeAtraso = $expen->gapDatesPeriodo($fechaExpensa->format('Y') . "-" . $fechaExpensa->format('m') . "-" . $diaPrimerVencimiento, $fechaDePago);
// 
// 		    
//                             //CALCULO FINAL
//                             $total_adeudado = $monto_adeudado_anterior + $monto_vencido_anterior;
//                             $intereses = $diasDeAtraso * ($data['PaymentDue']['annual_rate'] / 365) * $total_adeudado;
//                             $interesesMenosPago = $intereses - $montoPagado;
//                             if ($interesesMenosPago < 0) {//primero resto de los intereses, si sobre plata resto de la deuda
//                                 $total_adeudado = $total_adeudado + $interesesMenosPago;
//                                 $intereses = 0;
//                             } else {
//                                 //$total_adeudado queda igual, no alcanza para pagar
//                                 $intereses = $interesesMenosPago; //se reducen los intereses
//                             }
//                        
//                     }
                }
            }
        }

       
        //seteo en la nueva expensa para que devuelva y luego guarde
        $expense_data['Expense']['previous_debt'] = round($total_adeudado,2);
        $expense_data['Expense']['interests'] = round($intereses,2);
    }

    function obtenerNumeroUltimaExpensa($expense_data) {
        //busco ultima expensa
        $ultima_expensa = new Expense;
        $ultima_expensa_data = $ultima_expensa->find('first', array('conditions' => array('Expense.property_id' => $expense_data['Expense']['property_id'], 'Expense.expenditure_type_source' => $expense_data['Expense']['expenditure_type_source']), 'order' => array('Expense.expense_number DESC')));
        if ($ultima_expensa_data['Expense']['expense_number'] == NULL)
            return 0;
        else
            return $ultima_expensa_data['Expense']['expense_number'];
    }

    //
    function getExpenditureTypeSource($expenditure_type_data) {
        $lookupValue = new LookupValue;
        $lookupValue_data = $lookupValue->read(null, $expenditure_type_data['expenditure_type_source']);
        return $lookupValue_data["LookupValue"]['lookup_code'];
    }

    //
    function getExpenseLiquidationType($building) {
        $lookupValue = new LookupValue;
        $lookupValue_data = $lookupValue->read(null, $building['expense_liquidation_type']);
        return $lookupValue_data["LookupValue"]['lookup_code'];
    }

    //Dado un PaymentDue, devuelve el sistema de liquidación de intereses ('SECOND_DUE_DATE','ON_DATE','DEFERRED')
    function obtenerInterestSchemeType($paymentDue) {
        $lookupVal = new LookupValue;
        $lookupVal_data = $lookupVal->read(null, $paymentDue['interest_scheme']);
        return $lookupVal_data["LookupValue"]['lookup_code'];
    }

    //retorn true si pago antes de la fecha vencimiento, false si despues
    function pagoAntesDeFechaVencimiento($diaVenc, $fechaPago) {
        $fechaPago_format = substr($fechaPago, 0, 10);
        $datetime1 = new DateTime($fechaPago_format);
        if ($datetime1->format('d') < $diaVenc)
            return true;
        else
            return false;
    }

  //dada una fecha, me devuelve el numero de dia
    function obtenerDia($fechaPago) {
        $fechaPago_format = substr($fechaPago, 0, 10);
        $datetime1 = new DateTime($fechaPago_format);
        return $datetime1->format('d');
       
    }

    function getRefinancingSystem($building_id) {
        $building = new Building;
        $building_data = $building->read(null,$building_id);
		return $building_data['RefinancingSystem'];
	}

	function getPaymentDue($building_id){
        $building = new Building;
        $building_data = $building->read(null,$building_id);
        return $building_data['PaymentDue'];
	}

    function payIfPosible(& $expense_data, & $special_expense_data, $account){
        if ($account['regular_expense_balance'] > 0 ){
            $pay = min ($expense_data['Expense']['amount'],$account['regular_expense_balance']);
            $expense_data['Expense']['payment_amount'] = $pay;
        }
        if ($account['special_expense_balance'] > 0 ){
            $pay = min ($special_expense_data['Expense']['amount'],$account['special_expense_balance']);
            $special_expense_data['Expense']['payment_amount'] = $pay;
        }
    }

}

?>
